// 迭代实例化（Iterative Instantiation）是什么？
// 迭代实例化是一种较为特殊的模板实例化策略，主要思路如下：
// 1.编译阶段：编译器在编译各个翻译单元（.cpp 文件）时，不立即实例化模板代码，只是记录下需要实例化的模板信息。
// 2.预链接阶段：在链接之前，使用一个“预链接器”扫描所有目标文件，找出所有需要的模板实例。
// 3.补充实例化：如果发现有模板实例还没有被实例化，就重新编译模板代码，把缺失的实例化代码补充进来。
// 4.重复过程：这个过程会反复进行，直到所有需要的模板实例都被正确生成并链接成功为止。

// -----------------------------------------------------------------------------------
// 迭代实例化的优缺点
// 优点：
// 能最大限度地只生成需要的模板实例化代码，减少冗余。
// 可以确保所有用到的模板实例都被正确实例化。

// 缺点：
// 明显增加了链接时间，因为可能需要多次扫描和补充编译。
// 如果模板代码有错误，错误会被推迟到链接阶段才暴露，调试成本高。
// 需要记录模板定义在源文件中的具体位置，实现复杂。

// -------------------------------------------------------------
// 例子说明
// myfunc.h
template <typename T>
void myfunc(T val)
{
    // 复杂逻辑
}

// a.cpp
#include "myfunc.h"
void foo() { myfunc(42); } // 需要 myfunc<int>

// b.cpp
#include "myfunc.h"
void bar() { myfunc(3.14); } // 需要 myfunc<double>

// 迭代实例化的流程：
// 编译 a.cpp 和 b.cpp，只是记录下需要 myfunc<int> 和 myfunc<double>，但不生成代码。
// 预链接器扫描所有 .o 文件，发现 myfunc<int> 和 myfunc<double> 需要实例化。
// 编译器补充生成缺失的实例化代码。
// 如果还有遗漏，重复上一步，直到所有实例都补齐。
// 最终链接，生成可执行文件。

// --------------------------------------------------------
// 实际现状
// 迭代实例化主要是历史上一些编译器（如早期 MSVC）采用过的策略。
// 由于实现复杂、链接慢、调试困难，现代主流编译器基本不再采用这种方式。
